// 用户管理服务

import request from './request.js';

// 获取token
function getToken() {
	return request.getToken();
}

/**
 * 用户登录
 * @param {Object} params - 登录参数
 * @param {string} params.username - 用户名
 * @param {string} params.password - 密码
 * @returns {Promise} 返回登录结果
 */
function login(params) {
	return request.request({
		url: 'user/login',
		data: params
	});
}

/**
 * 用户注册
 * @param {Object} params - 注册参数
 * @param {string} params.username - 用户名
 * @param {string} params.password - 密码
 * @returns {Promise} 返回注册结果
 */
function register(params) {
	return request.request({
		url: 'user/register',
		data: params
	});
}

// 刷新token
async function refreshToken() {
	try {
		const oldToken = getToken();
		if (!oldToken) {
			return {
				success: false,
				message: '未找到token'
			};
		}
		
		const result = await request.request({
			url: 'user/refreshToken',
			// token会通过请求拦截器自动添加到请求头中
			needToken: true
		});
		
		if (result.code === 200) {
			// 更新存储的token
			const userInfo = uni.getStorageSync('userInfo');
			userInfo.token = result.data.token;
			uni.setStorageSync('userInfo', userInfo);
			
			return {
				success: true,
				token: result.data.token
			};
		} else {
			return {
				success: false,
				message: result.message || '刷新token失败'
			};
		}
	} catch (error) {
		console.error('刷新token失败', error);
		return {
			success: false,
			message: error.message || '刷新token失败'
		};
	}
}

// 检查token是否需要刷新
function checkTokenNeedsRefresh() {
	const token = getToken();
	if (!token) return false;
	
	try {
		// 解析token（不验证签名）
		const base64Url = token.split('.')[1];
		const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
		const payload = JSON.parse(atob(base64));
		
		// 获取过期时间
		const exp = payload.exp * 1000; // 转换为毫秒
		const now = Date.now();
		
		// 如果token将在30分钟内过期，就需要刷新
		return (exp - now) < 30 * 60 * 1000;
	} catch (error) {
		console.error('解析token失败', error);
		return false;
	}
}

// 自动刷新token的拦截器
async function tokenRefreshInterceptor(config) {
	if (checkTokenNeedsRefresh()) {
		const result = await refreshToken();
		if (result.success) {
			// 使用新token更新请求头
			config.header = config.header || {};
			config.header.Authorization = `Bearer ${result.token}`;
		}
	}
	return config;
}

export default {
	login,
	register,
	getToken,
	refreshToken,
	checkTokenNeedsRefresh,
	tokenRefreshInterceptor
}; 